package com.opensky.module.sys.interfaces.validator;

import com.alibaba.excel.util.CollectionUtils;
import com.opensky.module.sys.infrastructure.exception.MessageCode;
import com.opensky.module.sys.interfaces.assembler.SysRoleAssembler;
import com.opensky.module.sys.interfaces.frm.SysRoleQueryFrm;
import com.opensky.module.sys.interfaces.frm.SysRoleSaveFrm;
import com.opensky.module.sys.interfaces.vo.SysRoleVO;

import java.util.List;
import java.util.Objects;

/**
 * 角色表(表sys_role)数据校验对象
 *
 * @author 中国印
 * @date 2021-11-27 21:42:17
 */
public class SysRoleValidator {

    /**
     * 根据实际业务校验保存参数
     *
     * @param frm 待校验的frm对象
     */
    public static void validateFrm(SysRoleAssembler assembler, SysRoleSaveFrm frm) {
        String id = frm.getId();
        if (Objects.equals(id, null)) {
            // 新增数据校验
            validateFrmForInsert(assembler, frm);
        } else {
            // 更新数据校验
            validateFrmForUpdate(assembler, frm);
        }
    }

    /**
     * 方法说明：新增对象做校验
     *
     * @param assembler 转换器
     * @param frm       请求参数
     */
    private static void validateFrmForInsert(SysRoleAssembler assembler, SysRoleSaveFrm frm) {
        Long parentId = frm.getParentId();
        if (Objects.equals(parentId, null)) {
            parentId = 0L;
        }
        String name = frm.getName();
        List<SysRoleVO> nameList = assembler.getList(SysRoleQueryFrm.builder().parentId(parentId).name(name).build());
        if (!CollectionUtils.isEmpty(nameList)) {
            throw MessageCode.ROLE_NAME_REPEAT_ERROR.toException();
        }
    }

    /**
     * 方法说明：更新对象做校验
     *
     * @param assembler 转换器
     * @param frm       请求参数
     */
    private static void validateFrmForUpdate(SysRoleAssembler assembler, SysRoleSaveFrm frm) {
        Long parentId = frm.getParentId();
        if (Objects.equals(parentId, null)) {
            parentId = 0L;
        }
        String name = frm.getName();
        List<SysRoleVO> nameList = assembler.getList(SysRoleQueryFrm.builder().parentId(parentId).name(name).build());
        if (!CollectionUtils.isEmpty(nameList)) {
            nameList.forEach(vo -> {
                if (!Objects.equals(vo.getId(), frm.getId())) {
                    throw MessageCode.ROLE_NAME_REPEAT_ERROR.toException();
                }
            });
        }
    }

}

